"""
主题: 解除一个装饰器
问题: 一个装饰器已经作用在一个函数上，你想撤销它，直接访问原始的未包装的那个函数。
提示 : 
    多个包装器，那么访问 __wrapped__ 属性的行为是不可预知的，应该避免这样做
"""

from functools import wraps


def decorator1(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('Decorator 1')
        return func(*args, **kwargs)
    return wrapper


def decorator2(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('Decorator 2')
        return func(*args, **kwargs)
    return wrapper


@decorator1
def add1(x, y):
    return x + y

@decorator1
@decorator2
def add(x, y):
    return x + y

def recipe1():
    print(f"{add1(1, 2) = }")
    print(f"{add1.__wrapped__(2, 3) = }")

    print(f"{add(1, 2) = }")
    print(f"{add.__wrapped__(2, 3) = }")

def main():
    print('recipe1'.center(20, '*'))
    recipe1()


if __name__ == '__main__':
    main()      